package com.atguigu.c_designed.m1createModel.c1singleton;

/**
 * 单例设计模式介绍
 * 所谓类的单例设计模式，就是采取一定的方法保证在整个的软件系统中，对某个类只能存在一个对象实例，
 * 并且该类只提供一个取得其对象实例的方法(静态方法)。
 */
public class Singleton05 {

    public static void main(String[] args) {
        //测试
        LazySingleton04 instance = LazySingleton04.getInstance();
        LazySingleton04 instance2 = LazySingleton04.getInstance();
        System.out.println(instance == instance2); // true
        System.out.println("instance.hashCode=" + instance.hashCode());
        System.out.println("instance2.hashCode=" + instance2.hashCode());
    }
}

/**
 * 优缺点说明：
 * 1) Double-Check 概念是多线程开发中常使用到的，如代码中所示，我们进行了两次 if (singleton == null)检查，这
 * 样就可以保证线程安全了。
 * 2) 这样，实例化代码只用执行一次，后面再次访问时，判断 if (singleton == null)，直接 return 实例化对象，也避
 * 免的反复进行方法同步.
 * 3) 线程安全；延迟加载；效率较高
 * 4) 结论：在实际开发中，推荐使用这种单例设计模式
 */
// 懒汉式
class LazySingleton05 {
    //构造器私有化
    private LazySingleton05() {
    }

    //本类内部创建对象实例
    private static volatile LazySingleton05 instance;

    //    提供获取实例的方法
    public static  LazySingleton05 getInstance() {
        if (instance == null) {
           synchronized (LazySingleton05.class){
               if (instance ==null){
                   instance = new LazySingleton05();
               }
           }
        }
        return instance;
    }
}
